iT邦幫忙

1

[Basic C++] cout對齊輸出

  • 分享至 

  • xImage
  •  

ㄧ、問題描述

如果要cout像以下這樣的格式時,該怎麼做呢?
https://ithelp.ithome.com.tw/upload/images/20230506/20159955OojmHeWPnz.png

這樣的cout困難點在於:數字跟字串長度不固定
這樣導致第二行最後面的"="難以對齊

二、解法如下:

設一個counter,記錄每個字串的長度


int counter = 0;

對於字串,counter加上字串的長度

string name = "AIG";
counter += name.length();

對於數字,先經過std::to_string( ),再加上其長度

int id = 19;
string s_id = std::to_string(id);
counter += s_id.length();

最後在輸出line: 的時候,做setw( )跟right的配合

int lineNo = 200;
string s_lineNo = std::to_string(lineNo);

cout << setw(38-counter) << right << s_lineNo;

最後就可以輸出=啦!

cout << "=" << endl;

希望這個內容可以幫助你們對於一些不簡單的os輸出格式有不同的想法。感謝收看!


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

2
alien663
iT邦研究生 3 級 ‧ 2023-05-08 09:29:59

這樣不就好了,不必要計算字串長度阿,假設輸出固定38個字元寬度,把你的right改成left就好了。

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    cout << "======================================" << endl;
    cout << left << setw(37) << "Hello World"  <<  "=" << endl;
    cout << "======================================" << endl;
    return 0;
}
看更多先前的回應...收起先前的回應...
小楊 iT邦新手 5 級 ‧ 2023-05-16 00:27:44 檢舉

簡單的情況確實如此就可以啦~
但是更複雜一點的情況,比方說一行中輸出2個以上的數字與字串且都沒有限定字元寬度的情況,可能就需要counter這樣。
ex:

string s;
int num;
std::cin >> s >> num;

此時如果要cout << s << " " << num
且讓此行最後面第50字元處有一個"="該怎麼做呢~

當然我的解法也不一定是最好的,如果有更好的方法歡迎提供。謝謝!

alien663 iT邦研究生 3 級 ‧ 2023-05-16 08:36:41 檢舉

用string format轉成字串再一起輸出阿...
不然直接把num轉成string,直接加在後面再輸出也行

int a = 30;
string b = "Hellow World";
cout << left << setw(37) << b + to_string(a) << "=" << endl;
小楊 iT邦新手 5 級 ‧ 2023-07-09 01:32:35 檢舉
小楊 iT邦新手 5 級 ‧ 2023-07-09 01:40:50 檢舉

針對全部轉成string的作法,如果是要cout
也可以把string先全部放到ostringstream,再一次cout就可以了。

#include <sstream>

ostringstream osstr;

int a = 30;
string b = "Hello";
string c = "World";
osstr << b << " " << c;
osstr << to_string(a);
cout << "=" << setw(37) << left << osstr.str() << "=" << endl;

我要留言

立即登入留言